package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.anno.CacheFind;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

@Service
public class ItemCatServiceImpl implements ItemCatService{
    @Autowired
    private ItemCatMapper itemCatMapper;
    @Autowired(required = false)  //该项不是必须注入的spring容器启动时能注入则注入，注入不了就跳过
    private Jedis jedis;

    @Override
    public ItemCat findItemCatById(Long id) {

        return itemCatMapper.selectById(id);
    }

    @Override
    @CacheFind(key="ITEMCAT_PARENTID") //标识业务名称
    public List<EasyUITree> findItemCatList(Long parentId) {
        List<EasyUITree> treeList=new ArrayList<>();
        QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        List<ItemCat> itemCatList=itemCatMapper.selectList(queryWrapper);
        for (ItemCat itemCat:itemCatList){
            long id=itemCat.getId();
            String text=itemCat.getName();
            String state=itemCat.getIsParent()?"closed":"open";
            EasyUITree easyUITree=new EasyUITree(id,text,state);
            treeList.add(easyUITree);
        }
        return treeList;
    }



    /**
     * 原理说明：
     *      1.定义存取redis中的key  业务名称+标识符  ITEMCAT_PARENTID::0
     *      2.通过key获取redis中的记录
     *      3.空：查询数据库 将返回值结果保存到缓存中即可
     *      4.非空： 直接将缓存数据获取之后，返回给用户即可
     * @param parentId
     * @return
     */
    @Override

    public List<EasyUITree> findItemCatCache(Long parentId) {
        String key="ITEMCAT_PARENTID::"+parentId;
        List treeList=new ArrayList();
        if (jedis.exists(key)){
            //如果存在则直接返回
            String json=jedis.get(key);
            treeList= ObjectMapperUtil.toObj(json, treeList.getClass());
            System.out.println("查询Redis缓存");
        }else {
            //如果不存在  则查询数据库
            treeList=findItemCatList(parentId);
            //将数据保存到缓存中
            String json=ObjectMapperUtil.toJSON(treeList);
            jedis.set(key, json);
            System.out.println("查询数据库");
        }
        return treeList;
    }

}
